Function Calling ,它允許大型語言模型(LLM)在生成回應過程中,能根據輸入的 prompt 動態呼叫預定義的 Function 來執行具體的操作,這個技術通常用於讓模型可以與外部系統進行互動,例如調用 API、查詢資料庫或進行某些計算等,這樣能夠讓 LLM 應用更具功能性和實用性。
要完成這項機制,其作業流程大致是 :
{
"name": "get_delivery_date",
"description": "Get the delivery date for a customer's order. Call this whenever you need to know the delivery date, for example when a customer asks 'Where is my package'",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "The customer's order ID.",
},
},
"required": ["order_id"],
"additionalProperties": false,
}
}
這裡頭描述了這個 Function 具體用途、名稱、參數,這些資訊將會被包含在 system prompt 內容裡,提供給 LLM 模型。
查覺需要調用函數:當 LLM 模型在 Chat Message 中查覺需要 Function 來協助時,便會生成要調用的 Function name 以及 Function 參數值,而 Function 參數值也是從 Chat Message 內容中提取出來的,接著生成這些資訊,通常會是 json 格式。
執行函數:平台或框架接收著到上一步驟的生成資訊回應時,便會實際執行 Function,並取得 從而獲取外部資料或完成某項操作(取決於 Function 具體的程式邏輯)。
回傳結果給 LLM 模型:Function 執行結果會再回傳給 LLM 模型, LLM 模型接著可以根據取得的資訊最後再生成適當的回覆。
Function Calling 其實並不是 LLM 模型本身的能力,而是一種由開發者或平台在 LLM 周圍實現的外部機制,用來讓模型與外界進行互動。LLM 本質上是一個生成文本,接受 prompt 輸入後會生成對應的文本回應。而透過附加的中間層(如 API 或應用層的開發設計),可以引導模型識別出需要呼叫 Function 的情境,並讓其生成 Function Calling 所需要的資料,例如 Function name、parameters value。
實現這個情境有二個重要的組成:
通常來說 Function Calling 的能力取決於模型本身的設計以及框架如何與模型進行整合,這也意謂著並不是所有的 LLM 模型都具有適合 Function Calling的特性。最主要的原因在這一類的 LLM 模型必須具有能理解對 Function Calling 的認知識別,並能具體從 Chat Message 中提取參數值等資訊的能力。
那麼如果今天不使用 OpenAI 的平台服,而是使用其它模型但搭配著 LangChain 和 Semantic Kernel 這類框架,是否也能實現 Function Calling ? 當使用的模型並不是針對 Function Calling 而特別調整過的模型時,整合 LangChain 和 Semantic Kernel 的框架是有機會實現 Function Calling 的效果,但有可能在精確度上會有落差,例如明明應該要調用 Function 卻發現模型本身並未查覺,而未能生成 實現 Function Calling 所需要的資訊,因此還是會建議選擇其有實現 Function Calling 的模型會比較好。
這張圖描繪關於 Function Calling 的工作流程機制:
假設:今天要實現一個根據天氣資料提供穿搭建議的 LLM 應用
首先,這個應用會需一個 Function 應提供具體的天氣資訊,執行後能把天氣資訊給 LLM 模型,而 LLM 模型能據此生成最後的穿搭建議內容回覆使用者。根據這個需求,在這張圖的具體作業流程是:
LLM 模型要能實現 Function Calling ,並非單靠模型本身或是平台/框架就能實現,而是需要建構一個協作執行的環境,這裡面涉及到相當程度的複雜性,因此通常有平台的支援是最方便實現的,例如:OpenAI,這時候再搭配像 LangChain、Semantic Kernel 再進一步延伸到 Agent 的實作,就能更快速及輕易的建構能力更強大的 LLM 應用。